package org.ciallo.simplemusicplayer.util;

import com.github.promeg.pinyinhelper.Pinyin;
import timber.log.Timber;

/**
 * @author Jukomu
 * @Description: 汉字转拼音的工具类，基于 TinyPinyin 库
 * @Package: org.ciallo.simplemusicplayer.util
 * @Project: SimpleMusicPlayer
 * @name: PinyinUtil
 * @Date: 2025/5/30-04:36
 * @Filename: PinyinUtil
 */
public class PinyinUtil {

    /**
     * 将中文字符串转换为其主要拼音表示形式（无音调，首字母可能大写）。
     * 对于非中文字符，将保持原样。
     *
     * @param chineseStr 包含中文字符的输入字符串。
     * @return 转换后的拼音字符串；如果输入为null或空，则返回原始输入。
     *         例如："你好世界" -> "NiHaoShiJie" (取决于TinyPinyin的默认行为)
     *         或 "你好世界" -> "nihaoshijie"
     *         为了排序，通常会将整个字符串转换为小写，或者只处理首字母。
     *         这里我们先生成一个基本的拼音字符串。
     */
    public static String getPinyin(String chineseStr) {
        if (chineseStr == null || chineseStr.trim().isEmpty()) {
            return chineseStr;
        }
        try {
            // Pinyin.toPinyin() 方法会将整个字符串转换为拼音，并用空格分隔每个字的拼音
            // 例如："你好世界" -> "NI HAO SHI JIE"
            // 我们可以选择移除空格并处理大小写
            String pinyinWithSpace = Pinyin.toPinyin(chineseStr, " "); // 使用空格作为分隔符
            if (pinyinWithSpace != null && !pinyinWithSpace.isEmpty()) {
                // 简单处理：转为小写并移除所有空格，用于排序比较
                return pinyinWithSpace.replaceAll("\\s+", "").toLowerCase();
            }
        } catch (Exception e) {
            Timber.e(e, "Error converting string to pinyin: %s", chineseStr);
            // 发生错误时，可以返回原始字符串或特定错误标记
        }
        // 如果无法转换，或原始字符串不含中文，则返回处理过的原始字符串（例如转小写）
        return chineseStr.toLowerCase();
    }

    /**
     * 获取字符串的第一个汉字的拼音首字母（大写）。
     * 如果第一个字符不是汉字，则尝试返回其本身（如果是字母则大写，否则返回'#'）。
     *
     * @param text 输入字符串。
     * @return 拼音首字母（大写），或处理后的首字符，或'#'。
     */
    public static String getFirstPinyinChar(String text) {
        if (text == null || text.trim().isEmpty()) {
            return "#"; // 默认分组
        }
        char firstChar = text.charAt(0);
        if (Pinyin.isChinese(firstChar)) {
            try {
                // 获取第一个字的拼音，并取其首字母
                String pinyin = Pinyin.toPinyin(firstChar);
                if (pinyin != null && !pinyin.isEmpty()) {
                    return String.valueOf(pinyin.charAt(0)).toUpperCase();
                }
            } catch (Exception e) {
                Timber.e(e, "Error getting first pinyin char for: %s", text);
            }
        } else if (Character.isLetter(firstChar)) {
            return String.valueOf(firstChar).toUpperCase(); // 如果是字母，返回其大写
        }
        return "#"; // 其他情况（如数字、符号开头）归为 '#' 组
    }
}
